﻿using System;
using System.Data;
using System.Web.UI;
using System.Collections;

namespace SimpleService.ORM
{
    public class strings
    {

        public bool delete{
        get
        {
			return Convert.ToBoolean(_del);
        }
        set
        {
			//若還沒刪除(為false)
			if(!_del)
			{				
				//且 輸入的value為 true, 才做 delete()
				if(value)
				{ 
					//做 delete() 成功後回傳
					_del = _table.delete((string)_val[0]); 
				}
			}
        }	
	}
	
	ArrayList _key = new ArrayList(); //儲存索引鍵
	ArrayList _val = new ArrayList();	 //儲存真正的值
	public bool _del = false;	 //儲存是否刪除

	PersistenceObject _table;
/*
	加入一筆資料時
	strings["鍵"] = "值"
	
	_鍵 = "鍵"
	_值 = "值"
*/
	
	
//----------------------------------------------------------------------------------------------------
// ※建構子
//----------------------------------------------------------------------------------------------------
	
	//宣告時，還不確定內容
	public strings(PersistenceObject _table)
	{
		this._table = _table;
		
	}


	//宣告時，直接輸入多筆預設值
	public strings(string[] fieldnames, string[] data)
	{
		//檢查陣列「_鍵」長度 要和 陣列「_值」長度相同，check if the length of array fieldnames equals to the length of array data
		if(CheckLength()){
		
			int length = fieldnames.Length;
			
			for (int i=0; i<length; i++){
				_key.Add(fieldnames[i]);
				_val.Add(data[i]);
			}
		}
	}
	

	//設定數值
	public void Set(string indexkey,string data)
	{
		if( _del ) return;	//使已經 Delete 無法做處理
	
		//若是「鍵值的排行數」小於陣列總數，就「複寫」，否則run完Count還沒找到 就是「新增」
		if (ranking(indexkey.Trim()) < this._key.Count)
		{
			this._val[ranking(indexkey.Trim())] = data;
		}
		else 
		{
			_key.Add(indexkey.Trim());
			_val.Add(data);
		}
	}


//----------------------------------------------------------------------------------------------------
// ※使用方式   ds.Tables[".."].Rows[...]["...]
//----------------------------------------------------------------------------------------------------

	//輸入索引鍵
    public string this[string s]
    {
        get
        {
			try
			{
				string ans = ((string)this._val[ranking(s)]).Trim();
				return ans.Trim();
			}
			catch(Exception e)
			{
				return "無此筆資料";
			}
        }
        set
        {
			//使已經 Delete 無法做處理
			if(!_del)
			{		
				update(s.Trim(),value);
				Set(s.Trim(),value);
			}
        }
    }
	
	
	//輸入索引數字
    public string this[int i]
    {
        get
        {
			try
			{
				return ((string)(this._val[i])).Trim();
			}
			catch(Exception e)
			{
				return "無資料";
			}			
        }
        set
        {
			//使已經 Delete 無法做處理
			if(!_del)
			{	
				update(_table.ColsName[i],value);
				Set(_table.ColsName[i],value);	
			}
        }
    }



//----------------------------------------------------------------------------------------------------
// ※私有方法
//----------------------------------------------------------------------------------------------------

	//檢查陣列長度是否相同，相同才是正常，才可使用。
	private bool CheckLength(){
		
		bool ans = false;

		int keylength = _key.Count;
		int vallength = _val.Count;
		
		if (keylength == vallength) { ans = ans || true; }	else{ ans = false; }	
		
		return ans;
	}
	
	//計算行數
	private int CountRow(string indexkey)
	{
		//若是索引鍵已經存在
		int indexCount = 0;
		int i;
		for (i=0 ; i<this._key.Count ; i++){
			if (this._key[i].Equals(indexkey))
			{
				//算出相同的索引鍵有幾個
				indexCount = indexCount + 1;
			}
		}
		
		//數量+1 即是行數		
		return indexCount + 1;
	}	
	
	
	//取得該索引值為陣列中的第幾個
	private int ranking(string indexkey)
	{
		int i;
		
		for (i=0; i<this._key.Count; i++){
			if(this._key[i].Equals(indexkey))
			{
			 break;
			}
		}
		return i;
	}


	public IEnumerator GetEnumerator(){
		return _val.GetEnumerator();
	}


//----------------------------------------------------------------------------------------------------
// ※隱藏的處理動作
// ※update動作
//----------------------------------------------------------------------------------------------------
	
	public void update(string tagName, string value ){
		if( _del ) return;	//使已經 Delete 無法做 update 處理

		string in_value = value;
		// 判斷 傳入值 非 null 才加上引號，使 update 可把值改成 null
		if ( !(value.ToUpper() == "NULL") ){
			in_value = PersistenceUtility.isValue(value);
		}

        string SQLstr = ORMConfig.update;;
		SQLstr = SQLstr.Replace("__table__",_table._TableName);
		SQLstr = SQLstr.Replace("__field__",tagName);
		SQLstr = SQLstr.Replace("__fval__",in_value);
		SQLstr = SQLstr.Replace("__key__", _table.ColsName[0]);
		SQLstr = SQLstr.Replace("__val__", ""+this._val[0] );

		SqlOperator.ExecuteNonQuery(SQLstr, _table._connection);
	} // end of update
	
    }
}
